/**
 * 抽象方法也可以定义普通成员变量和成员方法
 * 但比普通类多了一个抽象方法
 * 存在的最大意义就是为了被继承
 * 继承的子类必须重写抽象方法,除非子类仍然是一个抽象类
 * 不能实例化抽象类
 * 抽象类不一定含有抽象方法，可以有构造方法
 */
abstract class Shape{

    //抽象方法没有具体的实现，不能是private类
    //抽象方法没有加访问限定符时，默认是public
    public abstract void draw();
}

/**
 * 子类仍然是一个抽象类
 */
abstract class A extends Shape{

}

class Rectangle extends Shape{
    @Override
    public void draw() {
        System.out.println("画一个矩形！");
    }
}

class Triangle extends Shape{
    @Override
    public void draw() {
        System.out.println("画一个三角形！");
    }
}

class Circle extends Shape{
    @Override
    public void draw() {
        System.out.println("画一个圆圈！");
    }
}

public class Test {

    //类的调用者书写的
    public static void drawMap(Shape shape){
        shape.draw();
    }
    public static void main(String[] args) {
        Rectangle rect = new Rectangle();
        Triangle triangle = new Triangle();
        Circle circle = new Circle();
        drawMap(rect);
        drawMap(triangle);
        drawMap(circle);
    }

    public static void main1(String[] args) {
        //无法实例化
        //Shape shape = new Shape();
        Rectangle rectangle = new Rectangle();
    }
}
